/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.negocio;
import comandos.CmdBD;
import comandos.Del.CmdDelCidade;
import comandos.Ins.CmdInsCidade;
import comandos.Sel.CmdSelAllCidade;
import comandos.Up.CmdUpAeroportoHasCidade;
import comandos.Up.CmdUpCidade;
import interfaces.IPersistencia;
import interfaces.IGerenciaCidade;
import erros.ErroAtualizacao;
import erros.ErroCadastramento;
import erros.ErroRemocao;
import erros.ErroRecuperacao;
import java.util.ArrayList;
import entidades.Cidade;
import erros.ErroPersistencia;
/**
 *
 * @author thiagostuckert
 * @author daniel
 * Classe relativa à controladora dde negócio da entidade cidade.
 */
public class CntrGerenciaCidade implements IGerenciaCidade {
    /**
     * Referência para o singleton da controladora de negócio
     * da entidade cidade.
     */
    private static CntrGerenciaCidade ref;
    /**
     * Controladora de persistência associada à essa controladora.
     */
    private IPersistencia cntrPersistencia;

    /**
     * Método que instancia o singleton da controladora de negócio
     * da entidade cidade.
     * @return Retorna a referência para o singleton criado.
     */
    public static CntrGerenciaCidade instanciar() {
        if (ref == null) {
            ref = new CntrGerenciaCidade();
        }
        return (ref);
    }

    /**
     * Seta a controladora de persistência associada à essa controladora,
     * isto é, se é um stub ou se é uma controladora real.
     * @param cntrPersistenciaParam referência para a controladora
     * de persistência.
     */
    public final void setCntrPersistencia(final IPersistencia
            cntrPersistenciaParam) {
        cntrPersistencia = cntrPersistenciaParam;
    }

    /**
     * Recupera as cidades cadastradas no banco.
     * @return ArrayList Vetor com as cidades do banco para mostrar.
     * @throws ErroRecuperacao  Lança a exceção de erro de recuperação
     * em caso de falha na tela.
     */
    @Override
    public ArrayList recuperarCidades() throws ErroRecuperacao {
        try {
            CmdBD comando = new CmdSelAllCidade();
            return (ArrayList) cntrPersistencia.executar(comando);
        } catch (ErroPersistencia e) {
            throw new ErroRecuperacao("Não foi possível recuperar as cidade");
        }
    }
    /**
     * Cadastra uma cidade no banco.
     * @param cidade Cidade a ser cadastrada.
     * @throws ErroCadastramento Lança a exceção de erro de cadastramento
     * em caso de faha
     */
    @Override
    public void cadastrarCidade(Cidade cidade) throws ErroCadastramento {
        try {
            CmdBD comando = new CmdInsCidade(cidade);
            cntrPersistencia.executar(comando);
        } catch (ErroPersistencia e) {
            throw new ErroCadastramento("Não foi possível cadastrar" +
                    " a cidade.");
        }

    }
    /**
     * Deleta uma cidade do banco.
     * @param cidade Cidade à ser deletada do banco.
     * @throws ErroRemocao Lança a exceção do erro de
     * remoção em caso de falha.
     */
    @Override
    public void deletarCidade(Cidade cidade) throws ErroRemocao {
        try {
           CmdBD comando = new CmdDelCidade(cidade);
           cntrPersistencia.executar(comando);
        } catch(ErroPersistencia e) {
            throw new ErroRemocao("Não foi possível remover a cidade");
        }
    }
    /**
     * Atualiza uma cidade no banco de dados.
     * @param cidadeVelha Cidade à ser atualizada.
     * @param cidadeNova Cidade contendo os atributos novos.
     * @throws ErroAtualizacao Lança a exceção de atualização
     * em caso de falha.
     */
    @Override
    public void atualizarCidade(Cidade cidadeVelha, Cidade cidadeNova)
            throws ErroAtualizacao {
        try {
            CmdBD comando = new CmdUpCidade(cidadeVelha, cidadeNova);
            cntrPersistencia.executar(comando);
            comando  = new CmdUpAeroportoHasCidade(cidadeVelha, cidadeNova);
            cntrPersistencia.executar(comando);
        } catch (ErroPersistencia e) {
            throw new ErroAtualizacao("Não foi possível atualizar a cidade");
        }
    }
}
